จากปฏิกิริยาสะท้อนสู่การวางแผน
ในวิวัฒนาการของการออกแบบตัวแทน เราก้าวจาก ตัวแทนปฏิกิริยาสะท้อน (Reflex Agents)ซึ่งแมปการรับรู้ (percepts) ไปยังการกระทำโดยตรงตามกฎง่าย ๆ (เช่น “หากรถข้างหน้าเบรก ให้เริ่มเบรก”) ไปจนถึง ตัวแทนแก้ปัญหา (Problem-Solving Agents)ตัวแทนปฏิกิริยาสะท้อนทำงานบนบริบทเฉพาะหน้า ในขณะที่ตัวแทนแก้ปัญหาคือ อิงเป้าหมาย (Goal-based)พวกมันพิจารณาผลลัพธ์ในอนาคตของการกระทำเพื่อค้นหาลำดับที่ตอบสนองวัตถุประสงค์เฉพาะ
- ตัวแทนปฏิกิริยาสะท้อน: $Action = Function(Percept)$
- ตัวแทนวางแผน: $Action\_Sequence = Search(State, Goal)$
การแทนสถานะแบบอะตอมิก (Atomic State Representation)
ในระดับพื้นฐานนี้ ตัวแทนใช้ การแทนแบบอะตอมิก (Atomic Representation)ซึ่งหมายความว่าสถานะของโลกถูกมองเป็นกล่องดำ—โหนดเดียวที่ไม่มีโครงสร้างภายในให้อัลกอริทึมการค้นหาเห็นได้ ตัวแทนให้เหตุผลเฉพาะเกี่ยวกับ:
- สถานะ ($S$): ภาพรวมของสภาพแวดล้อม ณ ขณะใดขณะหนึ่ง
- การกระทำ ($A$): การเปลี่ยนผ่านระหว่างสถานะต่าง ๆ
- การทดสอบเป้าหมาย: การตรวจสอบแบบบูลว่าสถานะ $s \in S_{goal}$ หรือไม่
วงจรการแก้ปัญหา (The Problem-Solving Loop)
ตัวแทนแก้ปัญหาดำเนินวงจรสี่ขั้นตอนที่ชัดเจนเพื่อสำรวจสภาพแวดล้อม:
- การกำหนดเป้าหมาย: ตัดสินใจว่าควรไล่ตามวัตถุประสงค์ใดโดยอิงจากสถานการณ์ปัจจุบัน
- การกำหนดปัญหา: การทำให้โลกจริงเป็นนามธรรมให้เป็นแบบจำลองทางคณิตศาสตร์ (สถานะและการกระทำ)
- การค้นหา: จำลองลำดับการกระทำเพื่อค้นหา เส้นทางที่เหมาะสมที่สุด.
- การดำเนินการ: ดำเนินการตามการกระทำที่พบในระหว่างขั้นตอนการค้นหาโดยไม่ต้องไตร่ตรองเพิ่มเติม (สมมติว่าสภาพแวดล้อมเป็นแบบคงที่)
การใช้งานด้วย Python (agent_types.py)
1
class ReflexAgent:
2
defact(self, percept):
3
# Direct mapping: Rule -> Action
4
return rules.get(percept, default_action)
5
6
class ProblemSolvingAgent:
7
def__init__(self):
8
self.seq = [] # Buffered action sequence
9
10
defact(self, percept):
11
# If we are mid-execution, continue
12
ifself.seq:
13
returnself.seq.pop(0)
14
15
# Otherwise, Plan (Search)
16
state = self.update_state(percept)
17
goal = self.formulate_goal(state)
18
problem = self.formulate_problem(state, goal)
19
20
# Search returns a list of actions
21
self.seq = search_algorithm(problem)
22
23
returnself.seq.pop(0)